﻿using System;
using System.Collections.Generic;
using System.Data.OleDb;
using System.IO;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Recursos.Model;
using System.Data;
using System.Configuration; 


namespace Recursos
{
    public partial class WebForm5 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var userSecurity = ((Usuario)Session["UserLogged"]);
            var permisos = new PermisosModel();
            if(userSecurity==null)
                Response.Redirect("~/NoAccess.aspx");
            if (!Page.IsPostBack && userSecurity != null && permisos.obtenerRolUsuario(userSecurity.Cedula).Equals("Administrador"))
                PopulateDropDown();

            else if (userSecurity == null || !permisos.obtenerRolUsuario(userSecurity.Cedula).Equals("Administrador"))
            {
                Response.Redirect("~/NoAccess.aspx");
            }
            
        }

        private void PopulateDropDown()
        {
            CargarSedes();
            CargarModalidad();
            CargarPeriodos();
        }

        private void CargarSedes()
        {
            var sedes = new SedeModel();
            DropDownListSede.DataSource = sedes.CargarSedes();
            DropDownListSede.DataTextField = "Nombre";
            DropDownListSede.DataValueField = "id";
            DropDownListSede.DataBind();
        }

        private void CargarModalidad()
        {
            var modalidad = new ModalidadModel();
            DropDownListModalidad.DataSource = modalidad.CargarModalidad();
            DropDownListModalidad.DataTextField = "Nombre";
            DropDownListModalidad.DataValueField = "id";
            DropDownListModalidad.DataBind();
        }

        private void CargarPeriodos()
        {
            var periodos = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
            DropDownListPeriodo.DataSource = periodos;
            DropDownListPeriodo.DataBind();
        }

        //private void DisplayFileContents(HttpPostedFile file)
        //{
        //    var fu = FileUpload1;
        //    if (fu.HasFile)
        //    {
        //        var path = FileUpload1.PostedFile.FileName;
        //        var strmail = string.Empty;
        //        var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path +
        //                                  ";Extended Properties=Excel 12.0;Persist Security Info=False; Mode=12;";
        //        var objConn = new OleDbConnection(connectionString);
        //        objConn.Open();
        //        var strConString="";
        //        var objCmdSelect = new OleDbCommand();
        //        var objAdapter1 = new OleDbDataAdapter();
        //        var objDataset1 = new DataSet();
        //        try
        //        {
        //           strConString = "SELECT * FROM [Hoja1$]";
        //           objCmdSelect = new OleDbCommand(strConString, objConn);
        //           objAdapter1.SelectCommand = objCmdSelect;
        //           objAdapter1.Fill(objDataset1, "ExcelData");
                   
        //        }
        //        catch (Exception)
        //        {

        //            strConString = "SELECT * FROM [Sheet1$]";
        //            objCmdSelect = new OleDbCommand(strConString, objConn);
        //            objAdapter1.SelectCommand = objCmdSelect;
        //            objAdapter1.Fill(objDataset1, "ExcelData");
        //        }
        //        GridView1.DataSource = objDataset1;
        //        GridView1.DataBind();
        //        objConn.Close();
        //    }
        //    else
        //    {
        //        WebMsgBox.Show("Debe ingresar un archivo de Excel para continuar con la operación.");
        //    }
        //}

        protected void ButtonVisualizar_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
            {
                string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
                string Extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
                string FolderPath = ConfigurationManager.AppSettings["FolderPath"];

                string FilePath = Server.MapPath(FolderPath + FileName);
                FileUpload1.SaveAs(FilePath);
                Import_To_Grid(FilePath, Extension, "Yes");
            }
        }
        private void Import_To_Grid(string FilePath, string Extension, string isHDR)
        {
            string conStr = "";
            switch (Extension)
            {
                case ".xls": //Excel 97-03
                    conStr = ConfigurationManager.ConnectionStrings["Excel03ConString"].ConnectionString;
                    break;
                case ".xlsx": //Excel 07
                    conStr = ConfigurationManager.ConnectionStrings["Excel07ConString"].ConnectionString;
                    break;
            }
            conStr = String.Format(conStr, FilePath, isHDR);
            OleDbConnection connExcel = new OleDbConnection(conStr);
            OleDbCommand cmdExcel = new OleDbCommand();
            OleDbDataAdapter oda = new OleDbDataAdapter();
            DataTable dt = new DataTable();
            cmdExcel.Connection = connExcel;

            //Get the name of First Sheet
            connExcel.Open();
            DataTable dtExcelSchema;
            dtExcelSchema = connExcel.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
            string SheetName = dtExcelSchema.Rows[0]["TABLE_NAME"].ToString();
            connExcel.Close();

            //Read Data from First Sheet
            connExcel.Open();
            cmdExcel.CommandText = "SELECT * From [" + SheetName + "]";
            oda.SelectCommand = cmdExcel;
            oda.Fill(dt);
            connExcel.Close();

            //Bind Data to GridView
            GridView1.Caption = Path.GetFileName(FilePath);
            GridView1.DataSource = dt;
            GridView1.DataBind();
        }

        protected void ButtonCargar_Click(object sender, EventArgs e)
        {
            if (FileUpload1.HasFile)
            {
                string FileName = Path.GetFileName(FileUpload1.PostedFile.FileName);
                string Extension = Path.GetExtension(FileUpload1.PostedFile.FileName);
                string FolderPath = ConfigurationManager.AppSettings["FolderPath"];

                string FilePath = Server.MapPath(FolderPath + FileName);
                FileUpload1.SaveAs(FilePath);
                Import_To_Grid(FilePath, Extension, "Yes");
            }

            if(DropDownListSede.SelectedValue=="")
            {
                WebMsgBox.Show("Complete la información requerida para la carga de grupos", "Cargar Grupos");
                return;
            }
            if (CargarValido())
                Procesar();
            Clean();
            

        }

        private bool CargarValido()
        {
            if (GetPeriodo() == 0)
            {
                WebMsgBox.Show("El periodo no es válido","Cargar Grupos");
                return false;
            }
            var cursos = new CursoModel();
            for (var i = 1; i < GridView1.Rows.Count; i++)
            {
                var curso = GridView1.Rows[i].Cells[0].Text;
                if (cursos.GetCursoByCodigo(curso) != null) continue;
                WebMsgBox.Show("El archivo " + FileUpload1.FileName + " contiene cursos no válidos", "Cargar Grupos");
                return false;
            }
            return true;
        }
   
        private void Procesar()
        {
            try
            {
                var datacontext = new DataClassesRecursosDataContext();
                var grupos = new Repository<Grupo>(datacontext);
                var profesR = new Repository<Usuario>(datacontext);
                var profes = profesR.GetAll();
                var cursos = new CursoModel();
                var usuariomodel= new UsuarioModel();

                for (var i = 0; i < GridView1.Rows.Count; i++)
                {

                    var curso = cursos.GetCursoByCodigo(GridView1.Rows[i].Cells[0].Text);
                    var profe = profes.Where(p => p.Nombre.Equals(GridView1.Rows[i].Cells[0].Text));
                    int idprofe=0;
                    if (!profe.Any()) 
                        idprofe = usuariomodel.CargarProfesor().Where(s=>s.Nombre=="sin asignar").First().id;
                    else
                        idprofe=profe.First().id;
                    int idsede=int.Parse(DropDownListSede.SelectedValue);
                    int idperiodo = GetPeriodo();
                    var grupo = new Grupo { IdCurso = curso.id, NumGrupo = int.Parse(GridView1.Rows[i].Cells[2].Text), Borrado = false, IdSede = idsede, IdPeriodo = idperiodo, Codigo = curso.Codigo +" "+int.Parse(GridView1.Rows[i].Cells[2].Text), IdProfesor = idprofe};
                    grupos.Insert(grupo);
                   
                }
                datacontext.SubmitChanges();

                WebMsgBox.Show("Grupos Cargados exitosamente del archivo " + FileUpload1.FileName, "Cargar Grupos");
            }
            catch (Exception)
            {
                WebMsgBox.Show("Ocurrió un error al procesar el archivo " + FileUpload1.FileName, "Cargar Grupos");

            }
            
        }

        private int GetPeriodo()
        {
            var datacontext = new DataClassesRecursosDataContext();
            var periodos = new Repository<Periodo>(datacontext);
            var periodo =  periodos.SearchOne(
                p =>
                p.Año == int.Parse(TextBoxAño.Text) && p.NumeroPeriodo == int.Parse(DropDownListPeriodo.SelectedValue) &&
                p.TipoPeriodo.Nombre.Equals(DropDownListModalidad.SelectedItem.Text));
            return periodo != null ? periodo.id : 0;
        }

        private void Clean()
        {
            GridView1.DataSource = null;
            GridView1.DataBind();
        }

    }
}